/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import dtos.ProdutoFisicoDTO;
import entidades.Armazem;
import entidades.ProdutoCatalogo;
import entidades.ProdutoFisico;
import excecoes.EntidadeExistenteException;
import excecoes.EntidadeNaoExistenteException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Utilizador
 */
@Stateless
public class ProdutoFisicoBean {
    
    @PersistenceContext
    private EntityManager em;
    
    @EJB
    ProdutoCatalogoBean produtoCatalogoBean;
    
    public void criarProdutoFisico(int id, String estado, String lote, int codArmazem,int idProdutoCatalogo) throws Exception{
        try {
            if(existeProdutoFisico(id)){
                throw new EntidadeExistenteException();
            }
            
            ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, idProdutoCatalogo);
            if(produtoCatalogo == null){
                throw new EntidadeNaoExistenteException();
            }
            
            Armazem armazem = em.find(Armazem.class, codArmazem);
            if(armazem == null){
                throw new EntidadeNaoExistenteException();
            }
            
            ProdutoFisico produtoFisico = new ProdutoFisico(id, estado, lote, armazem,produtoCatalogo);
     
            produtoCatalogo.adicionarProdutoFisico(produtoFisico);
            em.persist(produtoFisico);
     
            
        } catch (EntidadeExistenteException | EntidadeNaoExistenteException e) {
            throw e;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void removerProdutoFisico(int id, int idProdutoCatalogo){
        try {
            if(!existeProdutoFisico(id)){
                throw new EntidadeNaoExistenteException();
            }
            
            if(!existeProdutoCatalogo(idProdutoCatalogo)){
                throw new EntidadeNaoExistenteException();
            }
            
            ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, idProdutoCatalogo);
            if(produtoCatalogo == null){
                throw new EntidadeNaoExistenteException();
            }
            
            ProdutoFisico produtoFisico = em.find(ProdutoFisico.class, id);
            if(produtoFisico == null){
                throw new EntidadeNaoExistenteException();
            }
            
            em.remove(id);
            produtoCatalogo.removerProdutoFisico(produtoFisico);
 
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    private boolean existeProdutoFisico(int id) {
        return em.find(ProdutoFisico.class, id) != null;
    }
    
    private boolean existeProdutoCatalogo(int idProdutoCatalogo) {
        return em.find(ProdutoCatalogo.class, idProdutoCatalogo) != null;
    }

    public ProdutoFisicoDTO getProdutoFisico(int id) {
        try {
            ProdutoFisico produtoFisico = em.find(ProdutoFisico.class, id);
            if(produtoFisico == null){
                throw new EntidadeNaoExistenteException("Produto Físico Inexistente!");
            }
            return copiarProdutoFisicoParaDTOs(produtoFisico);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public List<ProdutoFisicoDTO> getAllProdutosFisico() {
        try {
            List<ProdutoFisico> produtosFisico = (List<ProdutoFisico>) em.createNamedQuery("findAllProdutosFisicos").getResultList();
            return copiarProdutosFisicoParaDTOs(produtosFisico);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }    
    }

    private List<ProdutoFisicoDTO> copiarProdutosFisicoParaDTOs(List<ProdutoFisico> produtosFisico) {
        List<ProdutoFisicoDTO> dtos = new ArrayList<>();

        for (ProdutoFisico pf : produtosFisico) {
            dtos.add(new ProdutoFisicoDTO(pf.getId(), pf.getEstado(), pf.getLote(), pf.getArmazem().getId(), pf.getProdutoCatalogo().getId()));
        }
        return dtos;
    }

    private ProdutoFisicoDTO copiarProdutoFisicoParaDTOs(ProdutoFisico pf) {
        List<ProdutoFisicoDTO> dtos = new ArrayList<>();
        
        dtos.add(new ProdutoFisicoDTO(pf.getId(), pf.getEstado(), pf.getLote(), pf.getArmazem().getId(), pf.getProdutoCatalogo().getId()));
        return (ProdutoFisicoDTO) dtos;
    }
}
 
